import axios from "axios";
import {BEARER_PREFIX, TOKEN_NAME} from "./constants.js";
import {confirmMessage} from "./message.js";
import {ElMessage} from "element-plus";

// `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
axios.defaults.baseURL = 'http://localhost:8088';


/**
 * 封装Axios的GET请求方法
 * @param url
 * @param params
 * @returns {Promise<AxiosResponse<any>> | *}
 */
export const doGet = (url, params) => {
    return axios({
        url: url,   // 请求接口地址
        method: 'GET',  // 请求方式
        params: params  // `params` 是与请求一起发送的 URL 参数
    });
}
/**
 * 封装Axios的POST请求方法
 * @param url
 * @param data
 * @returns {Promise<AxiosResponse<any>> | *}
 */
export const doPost = (url, data) => {
    return axios({
        url: url,   // 请求接口地址
        method: 'POST',  // 请求方式
        data: data   // `data` 是作为请求体被发送的数据
                    // 仅适用 'PUT', 'POST', 'DELETE 和 'PATCH' 请求方法
    });
}

/**
 * 封装Axios的PUT请求方法
 * @param url
 * @param data
 * @returns {Promise<AxiosResponse<any>> | *}
 */
export const doPut = (url, data) => {
    return axios({
        url: url,   // 请求接口地址
        method: 'PUT',  // 请求方式
        data: data   // `data` 是作为请求体被发送的数据
        // 仅适用 'PUT', 'POST', 'DELETE 和 'PATCH' 请求方法
    });
}

/**
 * 封装Axios的DELETE请求方法
 * @param url
 * @param data
 * @returns {Promise<AxiosResponse<any>> | *}
 */
export const doDelete = (url, data) => {
    return axios({
        url: url,   // 请求接口地址
        method: 'DELETE',  // 请求方式
        data: data   // `data` 是作为请求体被发送的数据
        // 仅适用 'PUT', 'POST', 'DELETE 和 'PATCH' 请求方法
    });
}
/**
 * 下载请求
 * @param url
 * @param params
 * @returns {Promise<AxiosResponse<any>> | *}
 */
export const doDownload = (url, params) => {
    return axios({
        url: url,   // 请求接口地址
        method: 'GET',  // 请求方式
        data: params, // `data` 是作为请求体被发送的数据
        responseType: 'blob'
    });
}


// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么? -> 在请求头中添加令牌TOKEN

    // 从本地获取令牌TOKEN
    let token = localStorage.getItem(TOKEN_NAME);
    // 判断本地令牌TOKEN是否存在
    if (token) {
        // 存在（localStorage） -> 添加令牌TOKEN请求头中
        config.headers.Authorization = BEARER_PREFIX + token;
        // 请求头中添加“记住我”状态
        config.headers['RememberMe'] = true
    } else {
        // 不存在（会话存储sessionStorage）  -> 添加令牌TOKEN请求头中
        token = sessionStorage.getItem(TOKEN_NAME);
        config.headers.Authorization = BEARER_PREFIX + token;
        // 请求头中添加“记住我”状态
        config.headers['RememberMe'] = false
    }

    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    // 判断响应状态码，如果大于900则表示token异常，引导用户重新登录
    if (response.data.code > 900) {
        confirmMessage('登录过期，请重新登录.')
            .then(() => {
                // 清除令牌TOKEN
                sessionStorage.removeItem(TOKEN_NAME)
                localStorage.removeItem(TOKEN_NAME)
                // 跳转至登录页面
                window.location.href = '/'
            })
            .catch(() => {
                // 清除令牌TOKEN
                sessionStorage.removeItem(TOKEN_NAME)
                localStorage.removeItem(TOKEN_NAME)
                // 跳转至登录页面
                window.location.href = '/'
            })
    }
    return response;
}, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
});